package com.zxy.config;


import com.zxy.bean.Car;
import com.zxy.bean.Color;
import com.zxy.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

/**
 * 自动装配
 *      Spring利用依赖注入（DI），完成对IOD容器中各个组件的依赖注入关系赋值；
 *
 *  1）@Autowired：自动注入：
 *              BookService{
 *              1）、默认有限按照类型去容器中找对应的组件：BookDao bean1 = context.getBean(BookDao.class);
 *                 找到就赋值
 *              2)、如果找到多个相同类型的组件，再将属性的名称作为组件的id去容器中查找
 *              3)@Qualifier("bookDao) 使用@Qualifier指定需要装配的组件的id，而不是使用属性名
 *              4）、自动装配默认一定要将属性值赋值好，没有就会报错
 *                    可以使用    @Autowired(required = false) 可以不用必须装配
 *               5）@Primary：让spring进行自动装配的时候，默认使用首选的bean
 *                 @Autowired
 *                  BookDao bookDao
 *              }
 *   2）Spring还支持使用@Resource（JSR250）和@Inject（JSR330）[Java标准注解]
 *                   @Resource默认是按照组件名称装配没有和其他注解联动ru@Primary @Autowire(reqiured = false)
 *
 *  3)@Autowired: 构造器，参数，方法，属性；
 *              1)标注在方法位置
 *              2）标注在构造器    如果组件只有一个有参构造器，这个有参构造器的@Autowired可以省略，参数位置的组件还是可以自动从容器中获取
 *              3）标注在参数
 * 4)自定义组件想要使用Spring容器底层的一些组件，（ApplicationContext，BeanFactory，xxx）
 *         自定义组件实现xxxAware：在创建对象的时候，会调用接口规定的方法注入相关组件，Aware
 *         把spring底层一些组件注入到自定义的Bean中
 *         xxxAware：功能使用xxxProcessor；
 *                  ApplicationContextAware==> ApplicationContextAwareProcessor
 */
@Configuration
@ComponentScan({"com.zxy"})
public class MainConfigOfAutowired {

    @Primary
    @Bean("bookDao2 ")
    public BookDao bookDao(){
        BookDao bookDao = new BookDao();
        bookDao.setLable("2");
        return bookDao;
    }

    /**
     * @Beam标注的方法创建对象的时候，方法参数的值从容器中获取  public Color color(@Autowired Car car)
     * @param car
     * @return
     */

    @Bean
    @Primary
    public Color color(Car car){
        Color color = new Color();
        color.setCar(car);
        return color;
    }
}
